const express = require('express');
const fs = require('fs');
const app = express();
const moment = require('moment');

//声明一个函数
function getClientIp(req) {
    var ipAddress;
    var forwardedIpsStr = req.headers['X-Forwarded-For'];//判断是否有反向代理头信息
    if (forwardedIpsStr) {//如果有，则将头信息中第一个地址拿出，该地址就是真实的客户端IP；
        var forwardedIps = forwardedIpsStr.split(',');
        ipAddress = forwardedIps[0];
    }
    if (!ipAddress) {//如果没有直接获取IP；
        ipAddress = req.connection.remoteAddress;
    }
    return ipAddress;
};

//声明一个函数, 将一些公共的执行代码封装起来.
let record = (req, res, next) => {
    //获取 ip 地址
    let ip = getClientIp(req);
    // 请求 URL 
    let str = '['+moment().format('YYYY-MM-DD HH:mm:ss') + ']   '+ ip + '   ' + req.url +'\r\n';
    //写入文件
    fs.writeFileSync('./access.log', str, {flag: 'a'});
    //调用 next 函数  
    next();
}

//使用中间件函数  使用了这个中间件之后, 每一个 HTTP 请求到来都会先执行 record 函数
app.use(record);

//get 类型的请求路由
app.get('/', (req, res) => {
    res.send('首页')
});

//post 请求的路由
app.post('/login', (req, res) => {
    res.send('登录成功')
});

//all 方法
app.all('/test', (req, res) => {
    res.send('测试')
})

app.listen(80, () => {
    console.log('成功...')
});